lst = [2, 1, 0, True, False]

"""
filter(function, iterable)
将lst中的元素依次作为实参传递给指定的函数去调用,即:
(lambda x: x-1)(2)
(lambda x: x-1)(1)
(lambda x: x-1)(0)
(lambda x: x-1)(True)
(lambda x: x-1)(False)
返回值分别为:1, 0, -1, 0, -1
再根据返回值进行过滤操作(即:对返回值进行bool判定,判定为True的留下,False过滤掉)
"""
# obj = filter(lambda x: x - 1, lst)  # 返回一个迭代器 将lst中的元素一个一个丢到lambda表达式
# print(list(obj))

"""
map(function, *iterables)
将多个可迭代对象中的元素依次对应作为实参传递给指定的函数去调用,即:
pow(3,3,2), pow(4,2,2), pow(2,5,2), pow(6,2,2)
返回值为:1, 0, 0, 0
"""


def my_pow(base, exp, mod=None):
    if mod is None:
        return base ** exp
    else:
        return base ** exp % mod


lst = [3, 4, 2, 6]
tup = (3, 2, 5, 2, 3)
lst2 = [2] * 5
obj = map(my_pow, lst, tup, lst2)
print(list(obj))

"""
reduce(function,iterable[,initial])
initial:初始值
如果没有指定initial参数,那么将lst中的前两个元素作为实参传递给指定函数调用,即:
pow(2, 1) => 2
然后将返回值和下一个元素继续作为实参传递给函数调用,即:
pow(2, 3) => 8
然后将返回值和下一个元素继续作为实参传递给函数调用,即:
pow(8, 4) => 4096
然后将返回值和下一个元素继续作为实参传递给函数调用,即:
pow(4096, 2) => 16777216
直到该列表元素耗尽,最后的结果返回

如果指定initial参数,那么将该参数的值和lst中的第一个元素作为实参
pow(2, 2) => 4
pow(4, 1) => 4
pow(4, 3) => 64
pow(64, 4) => 16777216
pow(16777216, 2) => 281474976710656

"""

from functools import reduce

# lst = [2, 1, 3, 4, 2]
# print(reduce(pow, lst, 2))

"""
使用reduce()实现累加
"""
lst = [3, 4, 1, 7]


# print(sum(lst))
def my_sum(iterable, start=0):
    return reduce(lambda x, y: x + y, iterable, start)


print(my_sum(lst, start=100))